import { Dep } from "./dep.js";
import { observe } from "./observe.js";

export function defineReactive(obj, key, val) {
  // 如果是对象，就递归处理
  const childOb = observe(val)
  //
  const dep = new Dep()
  
  Object.defineProperty(obj, key, {
    get() {
      console.log(`${key}: 被get`)
      // 收集，把放在Dep上的target装到watchers里面
      dep.depend()
      // 如果存在子 ob, 则一起收集
      if (childOb) {
        childOb.dep.depend()
      }
      return val
    },
    set(newVal) {
      console.log(`${key}: 被set`)
      if (newVal === val) return
      val = newVal
      // 如果赋值为对象，则对其进行响应式
      observe(val)
      // 通知更新
      dep.notify()
    }
  })
}